package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 【高级流】对象流---传输对象---使用率高----实现序列化接口 Serializable：功能：将对象转换为二进制
 *                                       版本号：一定要写，对象写出，对象读入，必须统一版本号
 * ObjectOutputStream    对象输出流    写出----Person.java
 * ObjectInputStream     对象输入流    读入----Person.java
 */
public class ObjectIO {

    //需求： 将Person.java 文件  变成对象  写出 --序列化
    @Test
    public void testOOS() {
        //传输对象；创建实现序列化接口的对象
        Person p = new Person();
        p.setNames("韩美娟");
        //String[] say=new String[]{}
        // 字符串数组:动态数组传输---给定元素决定数组长度
        p.setSay(new String[]{"百因必有果，你的报应就是我~"});
        //System.out.println(p);
        //传输符合条件对象---输出流---xxx.obj  文件是一种对象文件保存格式
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        try {
            fos = new FileOutputStream("person.obj");
            //高级流：ObjectOutputStream
            oos = new ObjectOutputStream(fos);
            /**
             * writeObject(Object obj)---写出对象
             *作用：将给定对象按照其结构进行转换，转换为一组字节，
             * 在通过处理的流写出，写出格式：xxx.obj
             *
             *抛出异常: NotSerializableException   没有实现序列化接口
             * 原因：传输对象没有实现Serializable
             *
             * Person 类---去掉实现序列化接口： Serializable
             *
             * 对象文件写出操作需要进行两个步骤：（专业术语）
             * 1.通过对象输出流将Person类，转换为一”组"字节，这个过程对象序列化
             * 2.将序列化后的字节再通过字节流（低级流）写出到项目中（硬盘上）做长久
             * 的保存，这个过程：数据持久化！
             */
            oos.writeObject(p);
            System.out.println("写出成功~");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos != null)
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }

    }


    /**
     * ObjectInputStream   对象输入流  /反序列化
     * 反序列化---二进制转换为对象
     * <p>
     * InvalidClassException      反序列化出现异常：版本号不匹配
     * <p>
     * ClassNotFoundException    没有这个类型异常
     * 产生原因：读入对象不正确,永久保存异常，类型读入不对
     * person1.class    person.obj
     * person2.class
     */
    @Test
    public void testOIS() throws IOException,ClassNotFoundException {
            //创建输入流---person.obj--读入
            FileInputStream fis = null;
            //创建高级流---对象输入流
            ObjectInputStream ois = null;
            try {
                fis = new FileInputStream("person.obj");
                ois = new ObjectInputStream(fis);
                //readObject()  返回读取的对象，反序列操作
                System.out.println(ois.readObject());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(ois!=null)
                    try {
                        ois.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }
        }
    }
